Guided Filter
引导滤波
Guided Image Filtering - 何恺明 2009
引导滤波(Guided Filtering)和双边滤波(BF)、最小二乘滤波(WLS)是三大边缘保持(Edge-perserving)滤波器。当然,引导滤波的功能不仅仅是边缘保持,只有当引导图是原图的时候,它就成了一个边缘保持滤波器。
它在图像去雾,图像抠图上均有相应的应用。
原理
![](https://i-blog.csdnimg.cn/blog_migrate/5678c4f0f9c1820c60c05f27da8dd70e.jpeg)
对于一个输入的图像
p
p
p,通过引导图像
I
I
I,经过滤波后得到输出图像
q
q
q,其中
p
p
p和
I
I
I都是算法的输入。引导滤波定义了如下所示的一个线性滤波过程,对于
i
i
i位置的像素点,得到的滤波输出是一个加权平均值:
q
i
=
∑
j
W
i
j
(
I
)
p
j
,
(1)
q_i=\sum_j W_{ij}(I)pj, \tag1
qi=j∑Wij(I)pj,(1)
其中,
i
i
i和
j
j
j分别表示像素下标。
W
i
j
W_{ij}
Wij是只和引导图像
I
I
I相关的滤波核。该滤波器相对于
p
p
p是线性的。
导向滤波的一个重要假设是输出图像
q
q
q和引导图像
I
I
I在滤波窗口
w
k
w_k
wk上存在局部线性关系:
q
i
=
a
k
I
i
+
b
k
,
∀
i
∈
w
k
,
(2)
q_i=a_kI_i+b_k,\forall i\in w_k,\tag2
qi=akIi+bk,∀i∈wk,(2)
对于一个以
r
r
r为半径的确定的窗口
w
k
w_k
wk,(
a
k
a_k
ak,
b
k
b_k
bk)也将是唯一确定的常量系数。这就保证了在一个局部区域里,如果引导图像
I
I
I有一个边缘的时候,输出图像
q
q
q也保持边缘不变,因为对于相邻的像素点而言,存在
∇
q
=
a
∇
I
\nabla q=a\nabla I
∇q=a∇I。因此只要求解得到了系数
a
a
a,
b
b
b也就得到了输出
q
q
q。同时认为输入图像中非边缘区域又不平滑的地方视为噪声
n
n
n,就有
q
i
=
p
i
−
n
i
q_i=p_i-n_i
qi=pi−ni。最终的目标就是最小化这个噪声。对于每一个滤波窗口,该算法在最小二乘意义上的最优化可表示为
a
r
g
m
i
n
∑
i
∈
w
k
(
q
i
−
p
i
)
2
a
r
g
m
i
n
∑
i
∈
w
k
(
a
k
I
i
+
b
k
−
p
i
)
2
(3)
argmin \sum_{i\in w_k}(q_i-p_i)^2 \\ argmin \sum_{i\in w_k}(a_kI_i+b_k-p_i)^2 \tag3
argmini∈wk∑(qi−pi)2argmini∈wk∑(akIi+bk−pi)2(3)
最后,引入一个正则化参数
ϵ
\epsilon
ϵ避免
a
k
a_k
ak过大,得到滤波窗口内的损失函数:
E
(
a
k
,
b
k
)
=
∑
i
∈
w
k
(
(
a
k
I
i
+
b
k
−
p
i
)
2
+
ϵ
a
k
2
)
.
(4)
E(a_k,b_k)=\sum_{i\in w_k}((a_kI_i+b_k-p_i)^2+\epsilon a_k^2).\tag4
E(ak,bk)=i∈wk∑((akIi+bk−pi)2+ϵak2).(4)
求解最优化过程(对参数求偏导):
δ
E
a
k
=
∑
i
∈
w
k
(
2
(
a
k
I
i
+
b
k
−
p
i
)
(
I
i
)
+
2
ϵ
a
k
)
=
0
(5)
\frac {\delta E}{a_k}=\sum_{i\in w_k}(2(a_kI_i+b_k-p_i)(I_i)+2\epsilon a_k)=0 \tag5
akδE=i∈wk∑(2(akIi+bk−pi)(Ii)+2ϵak)=0(5)
δ
E
b
k
=
∑
i
∈
w
k
(
2
(
a
k
I
i
+
b
k
−
p
i
)
)
=
0
(6)
\frac {\delta E}{b_k}=\sum_{i\in w_k}(2(a_kI_i+b_k-p_i))=0\tag6
bkδE=i∈wk∑(2(akIi+bk−pi))=0(6)
-----------------2020-10-27更新-----------------
因为求导这部分我之前也写的有问题,评论里也有问到,这里再把过程写详细点,方便大家对照自己的推导过程。
先求解
b
k
b_k
bk:
b
k
=
1
∣
w
∣
(
∑
i
∈
w
k
p
i
−
a
k
∑
i
∈
w
k
I
i
)
(7)
b_k=\frac{1}{|w|}(\sum_{i\in w_k}p_i-a_k\sum_{i\in w_k}I_i)\tag7
bk=∣w∣1(i∈wk∑pi−aki∈wk∑Ii)(7)
为了方便运算和简化公示,这里记
p
k
‾
=
1
∣
w
∣
∑
i
∈
w
k
p
i
\overline{p_k}=\frac{1}{|w|}\sum_{i\in w_k}p_i
pk=∣w∣1∑i∈wkpi,
I
k
‾
=
1
∣
w
∣
∑
i
∈
w
k
I
i
\overline{I_k}=\frac{1}{|w|}\sum_{i\in w_k}I_i
Ik=∣w∣1∑i∈wkIi,得
b
k
=
p
k
‾
−
a
k
I
k
‾
(8)
b_k = \overline{p_k}-a_k\overline{I_k}\tag8
bk=pk−akIk(8)
然后求解
a
k
a_k
ak:
整理前面的求导公式可得:
δ
E
a
k
=
∑
i
∈
w
k
(
a
k
I
i
2
+
b
k
I
i
−
p
i
I
i
+
ϵ
a
k
)
=
0
(9)
\frac {\delta E}{a_k}=\sum_{i\in w_k}(a_kI_i^2+b_kI_i-p_iI_i+\epsilon a_k)=0 \tag9
akδE=i∈wk∑(akIi2+bkIi−piIi+ϵak)=0(9)
代入简化后的
b
k
b_k
bk
∑
i
∈
w
k
(
a
k
I
i
2
+
(
p
k
‾
−
a
k
I
k
‾
)
I
i
−
p
i
I
i
+
ϵ
a
k
)
=
0
(10)
\sum_{i\in w_k}(a_kI_i^2+(\overline{p_k}-a_k\overline{I_k})I_i-p_iI_i+\epsilon a_k)=0\tag{10}
i∈wk∑(akIi2+(pk−akIk)Ii−piIi+ϵak)=0(10)
∑
i
∈
w
k
(
a
k
I
i
2
+
p
k
‾
I
i
−
a
k
I
k
‾
I
i
−
p
i
I
i
+
ϵ
a
k
)
=
0
(11)
\sum_{i\in w_k}(a_kI_i^2+\overline{p_k}I_i-a_k\overline{I_k}I_i-p_iI_i+\epsilon a_k)=0\tag{11}
i∈wk∑(akIi2+pkIi−akIkIi−piIi+ϵak)=0(11)
移项,注意求和符号的层级关系,提出
a
k
a_k
ak,注意带下标k的都可以从求和函数提出:
a
k
∑
i
∈
w
k
(
I
i
2
−
I
k
‾
I
i
+
ϵ
)
=
∑
i
∈
w
k
(
p
i
I
i
−
p
k
‾
I
i
)
(12)
a_k\sum_{i\in w_k}(I_i^2-\overline{I_k}I_i+\epsilon)=\sum_{i\in w_k}(p_iI_i-\overline{p_k}I_i)\tag{12}
aki∈wk∑(Ii2−IkIi+ϵ)=i∈wk∑(piIi−pkIi)(12)
a
k
(
∑
i
∈
w
k
I
i
2
−
I
k
‾
∑
i
∈
w
k
I
i
+
∑
i
∈
w
k
ϵ
)
=
∑
i
∈
w
k
p
i
I
i
−
p
k
‾
∑
i
∈
w
k
I
i
(13)
a_k(\sum_{i\in w_k}I_i^2-\overline{I_k}\sum_{i\in w_k}I_i+\sum_{i\in w_k}\epsilon)=\sum_{i\in w_k}p_iI_i-\overline{p_k}\sum_{i\in w_k}I_i\tag{13}
ak(i∈wk∑Ii2−Iki∈wk∑Ii+i∈wk∑ϵ)=i∈wk∑piIi−pki∈wk∑Ii(13)
为了进一步简化,在两边同除以
∣
w
∣
|w|
∣w∣后,将之前记的
p
k
‾
,
I
k
‾
\overline{p_k},\overline{I_k}
pk,Ik代入上式,并记
I
2
‾
k
=
1
∣
w
∣
∑
i
∈
w
k
I
i
2
\overline{I^2} _k=\frac{1}{|w|}\sum_{i\in w_k}I_i^2
I2k=∣w∣1∑i∈wkIi2,
p
k
I
k
‾
=
1
∣
w
∣
∑
i
∈
w
k
p
i
I
i
\overline{p_kI_k}=\frac{1}{|w|}\sum_{i\in w_k}p_iI_i
pkIk=∣w∣1∑i∈wkpiIi整理上式得:
a
k
(
I
2
‾
k
−
I
k
‾
2
+
ϵ
)
=
p
k
I
k
‾
−
p
k
‾
I
k
‾
(14)
a_k(\overline{I^2} _k-\overline{I_k}^2+\epsilon)=\overline{p_kI_k}-\overline{p_k}\overline{I_k}\tag{14}
ak(I2k−Ik2+ϵ)=pkIk−pkIk(14)
其中,公式左侧都是图像I相关的,在邻域w中的均值,根据方差与期望的推导公式
V
=
E
(
X
2
)
−
(
E
(
X
)
)
2
V=E(X^2)-(E(X))^2
V=E(X2)−(E(X))2,可得:
a
k
=
p
k
I
k
‾
−
p
k
‾
I
k
‾
σ
k
2
+
ϵ
(15)
a_k =\frac{\overline{p_kI_k}-\overline{p_k}\overline{I_k}}{\sigma_k^2+\epsilon}\tag{15}
ak=σk2+ϵpkIk−pkIk(15)
即为
a
k
a_k
ak的结果,相比与论文中的结果,这里进一步替换简化了公式。
-----------------分割线-----------------
接下来,只要把上述线性模型应用到整个图像的滤波窗口。但是可以看到,每一个像素点会被包含在多个窗口里。比如,如果用3*3的窗口滤波,那么除了边缘区域的每个点都会被包含在9个窗口里。因此,对于不同的窗口,我们将会得到
∣
w
∣
|w|
∣w∣个
q
i
q_i
qi值,就对所有的
q
i
q_i
qi值取平均,得到最终结果:
q
i
=
1
∣
w
∣
∑
k
:
i
∈
w
k
(
a
k
I
i
+
b
k
)
(16)
q_i=\frac{1}{|w|}\sum_{k:i\in w_k}(a_kI_i+b_k)\tag{16}
qi=∣w∣1k:i∈wk∑(akIi+bk)(16)
=
a
ˉ
i
I
i
+
b
ˉ
i
(17)
\ \ =\bar a_iI_i+\bar b_i\tag{17}
=aˉiIi+bˉi(17)
其中
a
ˉ
i
=
1
∣
w
∣
∑
k
:
i
∈
w
k
a
k
\bar a_i=\frac{1}{|w|}\sum_{k:i\in w_k}a_k
aˉi=∣w∣1∑k:i∈wkak,
b
ˉ
i
=
1
∣
w
∣
∑
k
:
i
∈
w
k
b
k
\bar b_i=\frac{1}{|w|}\sum_{k:i\in w_k}b_k
bˉi=∣w∣1∑k:i∈wkbk。由此建立了每个像素点从
I
I
I到
q
q
q的映射。
边缘保持
对于该算法,当
I
=
p
I=p
I=p时,即输入图像和引导图像是同一副图像时,该算法即成为一个边缘保持滤波器。同时,方程的解也可作如下表示:
a
k
=
σ
k
2
σ
k
2
+
ϵ
(18)
a_k =\cfrac{\sigma _k^2}{\sigma _k^2+\epsilon}\tag{18}
ak=σk2+ϵσk2(18)
b
k
=
(
1
−
a
k
)
p
ˉ
k
(19)
b_k = (1-a_k)\bar p_k\tag{19}
bk=(1−ak)pˉk(19)
从中可以看出,
ϵ
\epsilon
ϵ在这里相当于界定平滑区域和边缘区域的阈值。
考虑以下两种情况:
- Case 1:平坦区域。如果在某个滤波窗口内,该区域是相对平滑的,方差 σ k 2 \sigma _k^2 σk2将远远小于 ϵ \epsilon ϵ。从而 a k ≈ 0 , b k ≈ p ˉ k a_k\approx0,b_k\approx\bar p_k ak≈0,bk≈pˉk。相当于对该区域作均值滤波。
- Case 2:高方差区域。相反,如果该区域是边缘区域,方差很大, σ k 2 \sigma _k^2 σk2将远远大于 ϵ \epsilon ϵ。从而 a k ≈ 1 , b k ≈ 0 a_k\approx1,b_k\approx0 ak≈1,bk≈0。相当于在区域保持原有梯度。
应用
1、以自身作为引导图的保边平滑滤波:
![](https://i-blog.csdnimg.cn/blog_migrate/204d70b12d903dc687cc43d37a1cea71.jpeg)